package testing;

import java.util.ArrayList;
import java.util.HashSet;

import javax.swing.JOptionPane;

import grafo.Arista;
import grafo.Conjunto;
import grafo.Grafo;
import grafo.Nodo;
import grafo.Pareja;
import junit.framework.Assert;
import junit.framework.TestCase;

public class GrafoTester extends TestCase {
	
	private Grafo grafo1;
	private Grafo grafo2;
	private Grafo grafo3;
	
	private String nomFich1;
	private String nomFich2;
	private String nomFich3;
	
	private Nodo nodoOrig1;
	private Nodo nodoDest1;
	private Nodo nodoOrig2;
	private Nodo nodoDest2;
	private Nodo nodoOrig3;
	private Nodo nodoDest3;
	
	private String floydGrafo1;
	private String dijkstraGrafo1;
	private String floydGrafo2;
	private String dijkstraGrafo2;
	private String floydGrafo3;
	private String dijkstraGrafo3;
	
	private Conjunto<Pareja<String,String>> kruskalGrafo1;
	private Conjunto<Pareja<String,String>> kruskalGrafo2;
	private Conjunto
	<Pareja<String,String>> kruskalGrafo3;
	
	public GrafoTester(String sTestName){	  
	    super(sTestName);
	  }

	public void setUp(){
		nomFich1 = System.getProperty("user.dir")+"\\grafoTest1.txt";
		grafo1 = new Grafo();
		grafo1.setNomFichGrafo(nomFich1);
		grafo1.cargarGrafo();
		
		nodoOrig1 = grafo1.buscarNodo("a");
		nodoDest1 = grafo1.buscarNodo("j");

		kruskalGrafo1 = new Conjunto<Pareja<String,String>>();
		kruskalGrafo1.add(new Pareja<String, String>("a","b"));
		kruskalGrafo1.add(new Pareja<String, String>("d","c"));
		kruskalGrafo1.add(new Pareja<String, String>("e","h"));
		kruskalGrafo1.add(new Pareja<String, String>("f","e"));
		kruskalGrafo1.add(new Pareja<String, String>("i","j"));
		kruskalGrafo1.add(new Pareja<String, String>("h","g"));
		kruskalGrafo1.add(new Pareja<String, String>("g","i"));
		kruskalGrafo1.add(new Pareja<String, String>("b","d"));
		kruskalGrafo1.add(new Pareja<String, String>("c","f"));
		
		// [(a,b), (d,c), (e,h), (f,e), (i,j), (h,g), (g,i), (b,d), (c,f)]
				
		nomFich2 = System.getProperty("user.dir")+"\\grafoTest2.txt";
		grafo2 = new Grafo();
		grafo2.setNomFichGrafo(nomFich2);
		grafo2.cargarGrafo();
		
		nodoOrig2 = grafo2.buscarNodo("a");
		nodoDest2 = grafo2.buscarNodo("h");
		
		kruskalGrafo2 = new Conjunto<Pareja<String,String>>();
		kruskalGrafo2.add(new Pareja<String, String>("c","b"));
		kruskalGrafo2.add(new Pareja<String, String>("c","d"));
		kruskalGrafo2.add(new Pareja<String, String>("e","f"));
		kruskalGrafo2.add(new Pareja<String, String>("f","h"));
		kruskalGrafo2.add(new Pareja<String, String>("d","f"));
		kruskalGrafo2.add(new Pareja<String, String>("a","b"));
		kruskalGrafo2.add(new Pareja<String, String>("f","g"));
		
		//[(c,d), (c,b), (e,f), (f,h), (f,g), (a,b), (d,f)]
				
		nomFich3 = System.getProperty("user.dir")+"\\grafoTest3.txt";
		grafo3 = new Grafo();
		grafo3.setNomFichGrafo(nomFich3);
		grafo3.cargarGrafo();
		
		nodoOrig3 = grafo3.buscarNodo("g");
		nodoDest3 = grafo3.buscarNodo("f");
		
		kruskalGrafo3 = new Conjunto<Pareja<String,String>>();
		kruskalGrafo3.add(new Pareja<String, String>("e","d"));
		kruskalGrafo3.add(new Pareja<String, String>("a","e"));
		kruskalGrafo3.add(new Pareja<String, String>("c","e"));
		kruskalGrafo3.add(new Pareja<String, String>("f","d"));
		kruskalGrafo3.add(new Pareja<String, String>("c","b"));
		kruskalGrafo3.add(new Pareja<String, String>("g","b"));
		
		//[(e,d), (c,e), (f,d), (g,b), (c,b), (a,e)]
		
		floydGrafo1 = dijkstraGrafo1 = "a -> d -> c -> f -> e -> h -> j";
		floydGrafo2 = dijkstraGrafo2 = "a -> b -> e -> f -> h";
		floydGrafo3 = dijkstraGrafo3 = "g -> b -> c -> e -> d -> f";
	}

	public void testDijkstra1(){
		Assert.assertEquals(dijkstraGrafo1, grafo1.dijkstra(nodoOrig1, nodoDest1));
	}
	
	public void testDijkstra2(){
		Assert.assertEquals(dijkstraGrafo2, grafo2.dijkstra(nodoOrig2, nodoDest2));
	}
	
	public void testDijkstra3(){
		Assert.assertEquals(dijkstraGrafo3, grafo3.dijkstra(nodoOrig3, nodoDest3));
	}
	
	public void testFloyd1(){
		Assert.assertEquals(floydGrafo1, grafo1.floyd(nodoOrig1, nodoDest1));
	}
	
	public void testFloyd2(){
		Assert.assertEquals(floydGrafo2, grafo2.floyd(nodoOrig2, nodoDest2));
	}
	
	public void testFloyd3(){
		Assert.assertEquals(floydGrafo3, grafo3.floyd(nodoOrig3, nodoDest3));
	}
	
	public void testKruskal1(){
		/*if(kruskalGrafo1.equals(grafo1.kruskal()))
			JOptionPane.showMessageDialog(null, "FUNCIONA");
		else
			JOptionPane.showMessageDialog(null, "NO FUNCIONA");*/
		Assert.assertTrue(kruskalGrafo1.equals(grafo1.kruskal()));
	}
	
	public void testKruskal2(){
		Assert.assertTrue(kruskalGrafo2.equals(grafo2.kruskal()));
	}

	public void testKruskal3(){
		Assert.assertTrue(kruskalGrafo3.equals(grafo3.kruskal()));
	}

	
}
